package com.student.Activitys.activity;

import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.TextInputLayout;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.hyphenate.EMCallBack;
import com.hyphenate.EMError;
import com.hyphenate.chat.EMClient;
import com.student.Activitys.R;
import com.student.Activitys.activity.base.BaseActivity;
import com.student.Activitys.bean.UserBean;
import com.student.Activitys.http.manager.MyManager;
import com.student.Activitys.utils.Constant;
import com.student.Activitys.utils.JumperUtils;
import com.student.Activitys.utils.ToastUtils;

import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;

import butterknife.Bind;
import butterknife.OnClick;

/**
 * 项目名称：智慧校园学生端
 * 类描述：登录页面
 * 创建人：张飞祥
 * 创建时间：2017/9/20 14:52
 * 修改人：张飞祥
 * 修改时间：2017/9/20 14:52
 * 修改备注：
 */
public class LoginActivity extends BaseActivity implements TextWatcher {

    @Bind(R.id.et_user_name)
    EditText etUserName;
    @Bind(R.id.et_user_pwd)
    EditText etUserPwd;
    @Bind(R.id.btn_loding)
    Button btnLoding;
    @Bind(R.id.tv_title)
    TextView tvTitle;
    @Bind(R.id.app_bar_layout)
    AppBarLayout appBarLayout;
    @Bind(R.id.btn_forget_pwd)
    TextView btnForgetPwd;
    @Bind(R.id.input_layout_user_name)
    TextInputLayout inputLayoutUserName;
    @Bind(R.id.input_layout_password)
    TextInputLayout inputLayoutPassword;
    @Bind(R.id.btn_switch_identity)
    TextView btnSwitchIdentity;

    //用户名
    private String name;
    //密码
    private String pwd;
    //初始化网络请求
    public MyManager mApiManager;
    //数据请求加载
    private MaterialDialog mDialog;
    //本地保存用户
    private UserBean user = null;
    //本地保存用户身份
    private String identity = null;

    @Override
    protected void initUI() {
        setContentView(R.layout.act_loging);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getMyApiManager(LoginActivity.this, LoginActivity.this.getTaskId());
        //输入框监听
        etUserName.addTextChangedListener(this);
        etUserPwd.addTextChangedListener(this);
        //初始化按钮 不可点击
        btnLoding.setClickable(false);
    }

    @Override
    protected void initData() {
        //标题
        tvTitle.setText("登录");
        //标题文字颜色
        tvTitle.setTextColor(Color.BLACK);
        //标题背景
        appBarLayout.setBackgroundResource(R.color.color_bg_white);
        /**
         * 获取当前用户身份
         */
        identity = mACache.getAsString(Constant.USER_IDENTITY);


        /**
         * 创建 Gson 解析储存的用户数据 反填 界面数据
         */
        Gson gson = new Gson();
        user = gson.fromJson(mACache.getAsJSONObject(Constant.USER) + "", UserBean.class);
        if (user != null) {
            etUserName.setText(user.getXH());       //账号
            etUserPwd.setText(user.getPassword());  //密码
            //设置按钮可点击
            btnLoding.setBackgroundResource(R.drawable.login_button_selected_style);
            btnLoding.setTextColor(Color.parseColor("#FFFFFF"));
            btnLoding.setClickable(true);
        }
    }

    @Override
    protected void getNotData() {

    }

    /**
     * 点击事件
     *
     * @param view
     */
    @OnClick({R.id.btn_loding,R.id.btn_switch_identity})
    public void OnClick(View view) {
        switch (view.getId()) {
            case R.id.btn_loding:             //登录
                initViewRefresh();
                break;
            case R.id.btn_switch_identity:    //切换身份
                //清空 当前保存的身份
                mACache.put(Constant.USER_IDENTITY, "");
                //跳转
                JumperUtils.JumpTo(LoginActivity.this, IdentityActivity.class);
                //销毁当前页面
                finish();
                break;
        }
    }

    /**
     * 登录 网络请求 加载是否成功
     */
    @Subscriber(tag = Constant.BUS_LOGIN_ON_COMPLETED, mode = ThreadMode.MAIN)
    public void initAddress(String str) {

    }

    /**
     * 登录 网络请求 返回具体 数据实体
     */
    @Subscriber(tag = Constant.BUS_LOGIN, mode = ThreadMode.MAIN)
    public void initAddress(UserBean user) {
        if (user.getStatus().equals("1")) {
            signIn();
            //保存用户登录数据
            putSaveUser(user);
        } else {
            mDialog.dismiss();
            ToastUtils.showShort(LoginActivity.this, user.getMsg());
        }
    }

    /**
     * 文本输入框监听事件
     */
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        name = etUserName.getText().toString().trim();
        pwd = etUserPwd.getText().toString().trim();
        if (!name.equals("") && !pwd.equals("")) {
            btnLoding.setBackgroundResource(R.drawable.login_button_selected_style);
            btnLoding.setTextColor(Color.parseColor("#FFFFFF"));
            btnLoding.setClickable(true);
        } else {
            btnLoding.setBackgroundResource(R.drawable.login_button_unchecked_style);
            btnLoding.setTextColor(Color.parseColor("#dfdfdf"));
            btnLoding.setClickable(false);
        }
    }

    //初始化加载 数据
    private void initViewRefresh() {
        /**
         * 判断当前 是否有身份
         */
        if (identity != null) {
            name = etUserName.getText().toString().trim();
            pwd = etUserPwd.getText().toString().trim();
            //加载进度
            mDialog = new MaterialDialog.Builder(LoginActivity.this)
                    .content("正在登录，请稍后...")
                    .progress(true, 0)
                    .show();
            // 设置点击屏幕Dialog不消失
            mDialog.setCanceledOnTouchOutside(false);
            //取消Back键监听
            mDialog.setCancelable(false);
            //网络请求 请假详情数据
            mApiManager.login(Constant.HTTP_LOGIN_ACTION, name, pwd, identity);
        } else {
            new MaterialDialog.Builder(LoginActivity.this)
                    .title("错误")
                    .content("您当前没有确切的身份，所以抱歉您不能进行登录，请选择一个身份！")
                    .positiveText("选择身份")
                    .onPositive(new MaterialDialog.SingleButtonCallback() {
                        @Override
                        public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                            JumperUtils.JumpTo(LoginActivity.this, IdentityActivity.class);
                            finish();
                        }
                    }).show();
        }

    }

    /**
     * 环信登录方法
     */
    private void signIn() {

        name = etUserName.getText().toString().trim();
        pwd = etUserPwd.getText().toString().trim();
        EMClient.getInstance().login(name, pwd, new EMCallBack() {
            /**
             * 登录成功的回调
             */
            @Override
            public void onSuccess() {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mDialog.dismiss();
                        // 加载所有会话到内存
                        EMClient.getInstance().chatManager().loadAllConversations();
                        // 加载所有群组到内存，如果使用了群组的话
                        // EMClient.getInstance().groupManager().loadAllGroups();
                        // 登录成功跳转到主页面
                        JumperUtils.JumpTo(LoginActivity.this, MainActivity.class);
                        ToastUtils.showShort(LoginActivity.this, "登录成功");
                        finish();
                    }
                });
            }

            /**
             * 登录错误的回调
             * @param i
             * @param s
             */
            @Override
            public void onError(final int i, final String s) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mDialog.dismiss();
                        Log.d("lzan13", "登录失败 Error code:" + i + ", message:" + s);
                        /**
                         * 关于错误码可以参考官方api详细说明
                         * http://www.easemob.com/apidoc/android/chat3.0/classcom_1_1hyphenate_1_1_e_m_error.html
                         */
                        switch (i) {
                            // 网络异常 2
                            case EMError.NETWORK_ERROR:
                                ToastUtils.showShort(LoginActivity.this, "网络错误 code: " + i + ", message:" + s);
                                break;
                            // 无效的用户名 101
                            case EMError.INVALID_USER_NAME:
                                ToastUtils.showShort(LoginActivity.this, "无效的用户名 code: " + i + ", message:" + s);
                                break;
                            // 无效的密码 102
                            case EMError.INVALID_PASSWORD:
                                ToastUtils.showShort(LoginActivity.this, "无效的密码 code: " + i + ", message:" + s);
                                break;
                            // 用户认证失败，用户名或密码错误 202
                            case EMError.USER_AUTHENTICATION_FAILED:
                                ToastUtils.showShort(LoginActivity.this, "用户认证失败，用户名或密码错误 code: " + i + ", message:" + s);
                                break;
                            // 用户不存在 204
                            case EMError.USER_NOT_FOUND:
                                ToastUtils.showShort(LoginActivity.this, "用户不存在 code: " + i + ", message:" + s);
                                break;
                            // 无法访问到服务器 300
                            case EMError.SERVER_NOT_REACHABLE:
                                ToastUtils.showShort(LoginActivity.this, "无法访问到服务器 code: " + i + ", message:" + s);
                                break;
                            // 等待服务器响应超时 301
                            case EMError.SERVER_TIMEOUT:
                                ToastUtils.showShort(LoginActivity.this, "等待服务器响应超时 code: " + i + ", message:" + s);
                                break;
                            // 服务器繁忙 302
                            case EMError.SERVER_BUSY:
                                ToastUtils.showShort(LoginActivity.this, "服务器繁忙 code: " + i + ", message:" + s);
                                break;
                            // 未知 Server 异常 303 一般断网会出现这个错误
                            case EMError.SERVER_UNKNOWN_ERROR:
                                ToastUtils.showShort(LoginActivity.this, "未知的服务器异常 code: " + i + ", message:" + s);
                                break;
                            default:
                                ToastUtils.showShort(LoginActivity.this, "ml_sign_in_failed code: " + i + ", message:" + s);
                                break;
                        }
                    }
                });
            }

            @Override
            public void onProgress(int i, String s) {

            }
        });
    }

    /**
     * 保存 用户 “登录” 信息数据到本地
     */
    private void putSaveUser(UserBean user) {
        //保存用户实体
        user.setPassword(etUserPwd.getText().toString());
        mACache.put(Constant.USER, new Gson().toJson(user));
        mACache.put(Constant.USER_XH, user.getXH());
    }

    /**
     * 屏蔽 back 键
     */
    @Override
    public void onBackPressed() {
//        super.onBackPressed();
    }
}